package com.sinosoft.brokerchannel.base.utile;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;

import javax.mail.internet.MimeMessage;

/**
 * 需求名称：[健康险理赔渠道平台CMQ]
 * 类描述:[邮件工具]
 * 创建时间 :[2017-12-7$ 10:30$]
 *
 * @author [shilk]
 */
@Component
public class EmailUtils {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    public static String host;
    /**
     * 收件人
     */
    private final static String[] EMAIL_ADDRESS_TO = {"shilikun@sinosoft.com.cn"};

    /**
     * 抄送
     */
    private final static String[] EMAIL_ADDRESS_CC = { "ymingslk7045@qq.com"};

    @Autowired
    private JavaMailSender sender;

    @Value("${spring.mail.username}")
    private String from;

    @Value("${spring.profiles.active}")
    private String environmentCode;

    @Value("${spring.application.name}")
    private String applicationName;
    
    /**
     * 异常代码
     */
    private String exceptionCode = "";
    
    /**
     * 异常提示
     */
    private String exceptionName = "";
    
    /**
     * 异常信息
     */
    private String exceptionMess = "";

    /** 交互唯一标识 **/
    private String uuid;

    /** 接口名称 **/
    private String serviceName;

    /** 合作伙伴编码 **/
    private String companyCode;

    /**
     *
     *  需求名称：[健康险理赔渠道平台]
     *  功能:[异常发送邮件]
     *  @author [shilk]
     *  @date 2017年12月18日 下午2:58:01
     *  @param ex-{@link Exception}
     */
    public void sendException(BusinessException ex){
        exceptionCode = ex.getExceptionCode();
        exceptionName = ex.getExceptionMessage();
        exceptionMess = ToolUtils.getExceptionDetail(ex.getE());
        uuid = ex.getUuid();
        serviceName = ex.getServiceName();
        companyCode = ex.getCompanyCode();

        sendException();
    }
    
    /**
     * 	 
     *  需求名称：[健康险理赔渠道平台]
     *  功能:[异常发送邮件]
     *  @author [shilk]
     *  @date 2017年12月8日 下午2:58:01 
     *  @param e-{@link Exception}
     */
    public void sendException(Exception e){
    	exceptionMess = ToolUtils.getExceptionDetail(e);
    	sendException();
    }

    /**
     * 功能：异常发送邮件<br/>
     * 创建人：shilk<br/>
     * 创建时间：2017-12-7<br/>
     */
    private void sendException(){
    	/*
         * 获取IP地址
         */
        if(ToolUtils.isNullOrEmpty(host)){
            host = ToolUtils.getIpAddress();
        }
        StringBuilder subject = new StringBuilder();
        subject.append(applicationName).append("_");
        subject.append(environmentCode).append("_");
        subject.append("健康险理赔渠道平台系统异常");

        StringBuilder content = new StringBuilder();
        content.append("<html>");
        content.append("<body>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("IP地址：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(host).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("环境：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(environmentCode).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("系统：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(applicationName).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("合作伙伴编码：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(companyCode).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("接口名称：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(serviceName).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("接口唯一标识：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(uuid).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("异常代码：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(exceptionCode).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("提示信息：").append("</h4>");
        content.append("<font color=\"#FF0000\">").append(exceptionName).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("<span style=\"margin:5px 0px;\">");
        content.append("<h4 style=\"display:inline;\">").append("异常信息：").append("</h4>").append("<br/>");
        content.append("<font color=\"#FF0000\">").append(exceptionMess).append("</font>").append("<br/>");
        content.append("</span>");
        content.append("</body>");
        content.append("</html>");
        this.sendInlineResourceMail(
                subject.toString(),
                content.toString(),
                null,
                null);
    }
    
    /**
     * 发送嵌入静态资源（一般是图片）的邮件
     * @param subject - 主题
     * @param content 邮件内容，需要包括一个静态资源的id，比如：<img src=\"cid:rscId01\" >
     * @param rscPath 静态资源路径和文件名
     * @param rscId 静态资源id
     */
    private void sendInlineResourceMail(String subject, String content, String rscPath, String rscId){
        MimeMessage message = sender.createMimeMessage();
        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(EMAIL_ADDRESS_TO);
            helper.setCc(EMAIL_ADDRESS_CC);
            helper.setSubject(subject);
            helper.setText(content, true);

            //图片地址不为空时
            if(!ToolUtils.isNullOrEmpty(rscPath)){
                FileSystemResource res = new FileSystemResource(ResourceUtils.getFile(rscPath));
                helper.addInline(rscId, res);
            }
            sender.send(message);
            logger.info("嵌入静态资源的邮件已经发送。");
        } catch (Exception e) {
            logger.error("发送嵌入静态资源的邮件时发生异常！", e);
        }
    }
}
